package com.event.core.parse;

import cn.hutool.core.collection.CollUtil;
import com.event.common.model.EventCacheKey;
import com.event.common.model.MethodAnnotationEvent;
import com.event.core.context.AnnotationContext;
import org.springframework.cache.annotation.Cacheable;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/*
 * @description Cacheable解析器，可以继承该类，实现自己的解析逻辑
 * @author Bing
 * @date 2024/10/8 14:07
 **/
public abstract class CacheableParse {
    /**
     * 方法注解事件
     */
    private List<MethodAnnotationEvent> cacheableEvents;

    /**
     * 初始化
     * @param annotationContext
     */
    public void init(AnnotationContext annotationContext){
        List<MethodAnnotationEvent> methodAnnotationEvents = annotationContext.getMethodAnnotationEvents();
        if(CollUtil.isEmpty(methodAnnotationEvents)){
            return;
        }
        cacheableEvents = methodAnnotationEvents.stream().filter(methodAnnotationEvent -> methodAnnotationEvent.getAnnotation().annotationType().equals(Cacheable.class)).collect(Collectors.toList());
        if(CollUtil.isNotEmpty(cacheableEvents)){
            parse();
        }
    }

    /**
     * 获取Cacheable事件
     * @return
     */
    protected List<MethodAnnotationEvent> getCacheableEvents(){
        return cacheableEvents;
    }

    /**
     * 解析CacheKey
     */
    protected abstract void parse();

    /**
     * 获取解析后的CacheKey
     * @return
     */
    public abstract Map<String,List<EventCacheKey>> getCacheKeys();

    /**
     * 手动添加CacheKey
     * @param eventCacheKey
     */
    public abstract void addCacheKey(EventCacheKey eventCacheKey);

    /**
     * 获取解析后的CacheKey
     * @param eventCacheKey
     * @return
     */
    public abstract String parse(EventCacheKey eventCacheKey);
}
